import Util from './js/util.js'
import SystemDemo from './js/systemdemo.js'

//这个函数在整个wps加载项中是第一个执行的
function OnAddinLoad(ribbonUI) {
  if (typeof window.Application.ribbonUI != 'object') {
    window.Application.ribbonUI = ribbonUI
  }

  if (typeof window.Application.Enum != 'object') {
    // 如果没有内置枚举值
    window.Application.Enum = Util.WPS_Enum
  }

  //这几个导出函数是给外部业务系统调用的
  window.openOfficeFileFromSystemDemo = SystemDemo.openOfficeFileFromSystemDemo
  window.InvokeFromSystemDemo = SystemDemo.InvokeFromSystemDemo

  window.Application.PluginStorage.setItem('EnableFlag', false) //往PluginStorage中设置一个标记，用于控制两个按钮的置灰
  window.Application.PluginStorage.setItem('ApiEventFlag', false) //往PluginStorage中设置一个标记，用于控制ApiEvent的按钮label
  return true
}

var WebNotifycount = 0
async function OnAction(control) {
  const eleId = control.Id
  switch (eleId) {
    case 'btnShowMsg':
      // 显示文档名称
      {
        const doc = window.Application.ActiveDocument
        if (!doc) {
          alert('当前没有打开任何文档')
          return
        }
        alert(doc.Name)
      }
      break
    case 'btnIsEnbable': {
      // 控制按钮置灰
      let bFlag = window.Application.PluginStorage.getItem('EnableFlag')
      window.Application.PluginStorage.setItem('EnableFlag', !bFlag)

      //通知wps刷新以下几个按饰的状态
      window.Application.ribbonUI.InvalidateControl('btnIsEnbable')
      window.Application.ribbonUI.InvalidateControl('btnShowDialog')
      window.Application.ribbonUI.InvalidateControl('btnShowTaskPane')
      //window.Application.ribbonUI.Invalidate(); 这行代码打开则是刷新所有的按钮状态
      break
    }
    case 'btnShowDialog': {
      // 显示对话框
      window.Application.ShowDialog(
        Util.GetUrlPath() + Util.GetRouterHash() + '/dialog',
        '这是一个对话框网页',
        400 * window.devicePixelRatio,
        400 * window.devicePixelRatio,
        false
      )
      break
    }
    case 'btnShowTaskPane':
      // 显示任务窗格
      {
        let tsId = window.Application.PluginStorage.getItem('taskpane_id')
        if (!tsId) {
          let tskpane = window.Application.CreateTaskPane(
            Util.GetUrlPath() + Util.GetRouterHash() + '/taskpane'
          )
          let id = tskpane.ID
          window.Application.PluginStorage.setItem('taskpane_id', id)
          tskpane.Visible = true
        } else {
          let tskpane = window.Application.GetTaskPane(tsId)
          tskpane.Visible = !tskpane.Visible
        }
      }
      break
    case 'btnApiEvent':
      // 注册ApiEvent事件
      {
        let bFlag = window.Application.PluginStorage.getItem('ApiEventFlag')
        let bRegister = bFlag ? false : true
        window.Application.PluginStorage.setItem('ApiEventFlag', bRegister)
        if (bRegister) {
          window.Application.ApiEvent.AddApiEventListener(
            'DocumentNew',
            'ribbon.OnNewDocumentApiEvent'
          )
        } else {
          window.Application.ApiEvent.RemoveApiEventListener(
            'DocumentNew',
            'ribbon.OnNewDocumentApiEvent'
          )
        }

        window.Application.ribbonUI.InvalidateControl('btnApiEvent')
      }
      break
    case 'btnWebNotify':
      // 主动通知业务系统
      {
        let currentTime = new Date()
        let timeStr =
          currentTime.getHours() + ':' + currentTime.getMinutes() + ':' + currentTime.getSeconds()
        window.Application.OAAssist.WebNotify(
          '这行内容由wps加载项主动送达给业务系统，可以任意自定义, 比如时间值:' +
            timeStr +
            '，次数：' +
            ++WebNotifycount,
          true
        )
      }
      break
    case 'btnAddComment':
      // 添加批注
      {
        const doc = window.Application.ActiveDocument
        if (!doc) {
          alert('当前没有打开任何文档')
          return
        }
        const selection = window.Application.Selection
        if (selection) {
          selection.Range.Comments.Add(selection.Range, '这是添加的批注')
        }
      }
      break
    case 'btnGetContent':
      // 获取文档内容
      {
        const doc = window.Application.ActiveDocument
        if (!doc) {
          alert('当前没有打开任何文档')
          return
        }
        const content = doc.Range().Text
        alert('文档内容：\n' + content)
      }
      break
    case 'btnSetHeader':
      {
        const doc = window.Application.ActiveDocument
        if (!doc) {
          alert('当前没有打开任何文档')
          return
        }
        // 开启修订模式
        doc.TrackRevisions = true

        const sections = doc.Sections
        if (sections.Count > 0) {
          const header = sections.Item(1).Headers.Item(1)
          const range = header.Range

          // 在修订模式下添加内容
          range.Text = 'WPS加载项测试'
          range.Font.Name = '宋体'
          range.Font.Size = 12 // 小四对应12磅
          range.Paragraphs.Alignment = 2 // 2表示右对齐

          // 显示修订标记
          doc.ShowRevisions = true
        }
      }
      break
    case 'btnTestGet':
      // 测试GET请求
      {
        var get_requestOptions = {
          method: 'GET',
          redirect: 'follow'
        }

        const get_res = await fetch(
          'https://jsonplaceholder.typicode.com/posts/1',
          get_requestOptions
        )
        const data = await get_res.text()
        alert('请求结果:' + data)
      }
      break
    case 'btnTestPost':
      // 测试POST请求
      {
        var myHeaders = new Headers()
        myHeaders.append('Content-Type', 'application/json')

        var raw = JSON.stringify({})

        var post_requestOptions = {
          method: 'POST',
          headers: myHeaders,
          body: raw,
          redirect: 'follow'
        }

        const post_res = await fetch(
          'https://jsonplaceholder.typicode.com/posts',
          post_requestOptions
        )
        const data = await post_res.text()
        alert('请求结果:' + data)
      }
      break
    default:
      break
  }
  return true
}

function GetImage(control) {
  const eleId = control.Id
  switch (eleId) {
    case 'btnShowMsg':
      return 'images/1.svg'
    case 'btnShowDialog':
      return 'images/2.svg'
    case 'btnShowTaskPane':
      return 'images/3.svg'
    default:
  }
  return 'images/newFromTemp.svg'
}

function OnGetEnabled(control) {
  const eleId = control.Id
  switch (eleId) {
    case 'btnShowMsg':
      return true
    case 'btnShowDialog': {
      let bFlag = window.Application.PluginStorage.getItem('EnableFlag')
      return bFlag
    }
    case 'btnShowTaskPane': {
      let bFlag = window.Application.PluginStorage.getItem('EnableFlag')
      return bFlag
    }
    default:
      break
  }
  return true
}

function OnGetVisible(control) {
  const eleId = control.Id
  console.log(eleId)
  return true
}

function OnGetLabel(control) {
  const eleId = control.Id
  switch (eleId) {
    case 'btnIsEnbable': {
      let bFlag = window.Application.PluginStorage.getItem('EnableFlag')
      return bFlag ? '按钮Disable' : '按钮Enable'
    }
    case 'btnApiEvent': {
      let bFlag = window.Application.PluginStorage.getItem('ApiEventFlag')
      return bFlag ? '清除新建文件事件' : '注册新建文件事件'
    }
  }
  return ''
}

function OnNewDocumentApiEvent(doc) {
  alert('新建文件事件响应，取文件名: ' + doc.Name)
}

//这些函数是给wps客户端调用的
export default {
  OnAddinLoad,
  OnAction,
  GetImage,
  OnGetEnabled,
  OnGetVisible,
  OnGetLabel,
  OnNewDocumentApiEvent
}
